package com.sybil.ot.dominio;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SIL_ORDENES_TRABAJO")
@NamedQueries({
   @NamedQuery(
           name = "OrdenTrabajo.maxPorSerie",
           query = "SELECT MAX(o.llave.numero) FROM OrdenTrabajo o WHERE o.llave.serie = :serie"
   )
})
public class OrdenTrabajo implements Serializable {

   private static final long serialVersionUID = 1L;
   protected OrdenTrabajoPK llave;
//   private String solicitante;
   private String descripcion;
   private Date fechaInicio;
   private Date fechaFin;
   private long tiempoRespuesta;
   private String generoParo;
   private long tiempoParo;
   private String rutaAnexo;
   private String estatus;
   private String usuarioCreo;
   private String usuarioModif;
   private Usuario solicitante;
   private Planta planta;
   private CausaParo causaParo;
   private Empleado empleado;
   private Zona zona;
   private List<Mantenimiento> mantenimientos;
   private List<TrabajoRealizado> trabajosRealizados;
   private List<DefectoParo> defectos;
   private List<HistoricoOT> historicos;

   public OrdenTrabajo() {
   }

   public OrdenTrabajo(OrdenTrabajoPK llave) {
      this.llave = llave;
   }

   public OrdenTrabajo(String serie, int numero) {
      this.llave = new OrdenTrabajoPK(serie, numero);
   }

   public OrdenTrabajo(OrdenTrabajoPK llave, String descripcion,
           Date fechaInicio, String generoParo, long tiempoParo, String estatus) {
      this.llave = llave;
      this.descripcion = descripcion;
      this.fechaInicio = fechaInicio;
      this.generoParo = generoParo;
      this.tiempoParo = tiempoParo;
      this.estatus = estatus;
   }

   @EmbeddedId
   public OrdenTrabajoPK getLlave() {
      return llave;
   }

   public void setLlave(OrdenTrabajoPK llave) {
      this.llave = llave;
   }

   @JoinColumn(name = "ORTR_USPE_CLAVE", referencedColumnName = "USPE_CLAVE")
   @ManyToOne(optional = false)
   public Usuario getSolicitante() {
      return solicitante;
   }

   public void setSolicitante(Usuario solicitante) {
      this.solicitante = solicitante;
   }

   @JoinColumn(name = "ORTR_PLAN_CLAVE", referencedColumnName = "PLAN_CLAVE")
   @ManyToOne(optional = false)
   public Planta getPlanta() {
      return planta;
   }

   public void setPlanta(Planta planta) {
      this.planta = planta;
   }

//   @Basic(optional = false)
//   @Column(name = "ORTR_SOLICITANTE")
//   public String getSolicitante() {
//      return solicitante;
//   }
//
//   public void setSolicitante(String solicitante) {
//      this.solicitante = solicitante;
//   }
   @NotNull
   @Size(min = 1, max = 150, message = "La Descripción debe tener entre 1 y 150 caracteres.")
   @Basic(optional = false)
   @Column(name = "ORTR_DESCRIPCION")
   public String getDescripcion() {
      return descripcion;
   }

   public void setDescripcion(String descripcion) {
      this.descripcion = descripcion;
   }

   @Basic(optional = false)
   @NotNull(message = "Tiene que especificar la fecha de inicio.")
   @Column(name = "ORTR_FECHA_INICIO")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFechaInicio() {
      return fechaInicio;
   }

   public void setFechaInicio(Date fechaInicio) {
      this.fechaInicio = fechaInicio;
   }

   @Column(name = "ORTR_FECHA_FIN")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFechaFin() {
      return fechaFin;
   }

   public void setFechaFin(Date fechaFin) {
      this.fechaFin = fechaFin;
   }

   @Basic(optional = false)
   @Column(name = "ORTR_TIEMPO_RESPUESTA")
   public long getTiempoRespuesta() {
      return tiempoRespuesta;
   }

   public void setTiempoRespuesta(long tiempoRespuesta) {
      this.tiempoRespuesta = tiempoRespuesta;
   }

   @NotNull
   @Size(min = 1, max = 1)
   @Basic(optional = false)
   @Column(name = "ORTR_GENERO_PARO")
   public String getGeneroParo() {
      return generoParo;
   }

   public void setGeneroParo(String generoParo) {
      this.generoParo = generoParo;
   }

   @Basic(optional = false)
   @Column(name = "ORTR_TIEMPO_PARO")
   public long getTiempoParo() {
      return tiempoParo;
   }

   public void setTiempoParo(long tiempoParo) {
      this.tiempoParo = tiempoParo;
   }

   @Size(max = 250)
   @Column(name = "ORTR_RUTA_ANEXO")
   public String getRutaAnexo() {
      return rutaAnexo;
   }

   public void setRutaAnexo(String rutaAnexo) {
      this.rutaAnexo = rutaAnexo;
   }

   @Basic(optional = false)
   @Column(name = "ORTR_ESTATUS")
   public String getEstatus() {
      return estatus;
   }

   public void setEstatus(String estatus) {
      this.estatus = estatus;
   }

   @Basic(optional = false)
   @Column(name = "ORTR_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "ORTR_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @JoinColumn(name = "ORTR_CPOT_CLAVE", referencedColumnName = "CPOT_CLAVE")
   @ManyToOne
   public CausaParo getCausaParo() {
      return causaParo;
   }

   public void setCausaParo(CausaParo causaParo) {
      this.causaParo = causaParo;
   }

   @Valid
   @NotNull(message = "Especificar el responsable")
   @JoinColumn(name = "ORTR_PERS_CODIGO", referencedColumnName = "PERS_CODIGO")
   @ManyToOne(optional = false)
   public Empleado getEmpleado() {
      return empleado;
   }

   public void setEmpleado(Empleado empleado) {
      this.empleado = empleado;
   }

   @Valid
   @NotNull(message = "Especificar la zona")
   @JoinColumn(name = "ORTR_ZONA_CLAVE", referencedColumnName = "ZONA_CLAVE")
   @ManyToOne(optional = false)
   public Zona getZona() {
      return zona;
   }

   public void setZona(Zona zona) {
      this.zona = zona;
   }

   @Valid
   @Size(min = 1, message = "Debe tener al menos un mantenimiento")
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "ordenTrabajo")
   public List<Mantenimiento> getMantenimientos() {
      return mantenimientos;
   }

   public void setMantenimientos(List<Mantenimiento> mantenimientos) {
      this.mantenimientos = mantenimientos;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "ordenTrabajo")
   public List<TrabajoRealizado> getTrabajosRealizados() {
      return trabajosRealizados;
   }

   public void setTrabajosRealizados(List<TrabajoRealizado> trabajosRealizados) {
      this.trabajosRealizados = trabajosRealizados;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "ordenTrabajo")
   public List<DefectoParo> getDefectos() {
      return defectos;
   }

   public void setDefectos(List<DefectoParo> defectos) {
      this.defectos = defectos;
   }

   @OrderBy("fecha DESC")
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "ordenTrabajo")
   public List<HistoricoOT> getHistoricos() {
      return historicos;
   }

   public void setHistoricos(List<HistoricoOT> historicos) {
      this.historicos = historicos;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof OrdenTrabajo)) {
         return false;
      }
      OrdenTrabajo other = (OrdenTrabajo) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "OrdenTrabajo[ llave=" + llave + " ]";
   }
}
